<?php

/**
 * Хранит информацию о названии классов в школе
 * Работает с потоками классов и специализацией
 */
class classes {
	
	/**
	 * Код класса
	 * @var string. Допустимые значения см. в функции set_code
	 */
	private $code = NULL;
	
	/**
	 * Классы вместе с кодом
	 * Используется для отображения в форме выдачи
	 * @var bool
	 */
	private $with_code = NULL;
	
	/**
	 * Данные о принадлежности определенных классов к специализации и потоку
	 * @var array
	 */
	private $classes_data = NULL;
	
	function __construct($code, $with_code = false) {
		$this->set_code($code);
		$this->set_with_code($with_code);
		$this->init_classes_data();
	}
	
	function __destruct() {
		
	}
	
	function set_code($code) {
		if (preg_match("/^(all|a|b|c|pm|cb|10-[1-8]|11-(1[0-6]|[1-9]))$/", $code)) {
			$this->code = $code;
		} else {
			throw new Exception("'$code' is invalid class code");
		}
	}
	
	function set_with_code($with_code) {
		$this->with_code = $with_code;
	}
	
	private function init_classes_data() {
		global $CFG;
		$this->classes_data = include($CFG->app_dir . '/config/classes.php');
	}
	
	/**
	 * Возвращает заголовки групп классов для отображения в форме формирования отчета
	 */
	private function get_codes_for_display() {
		if ($this->with_code) {
			if ($this->code == 'all') {
				return array(
					'all' => 'Все классы',
					'a' => 'Поток 10-х',
					'b' => 'Поток 11-х. 2-годы',
					'c' => 'Поток 11-х. 1-годы'
				);
			} else if ($this->code == 'a') {
				return array(
					'a' => 'Поток 10-х'
				);
			} else if ($this->code == 'b') {
				return array(
					'b' => 'Поток 11-х. 2-годы'
				);
			} else if ($this->code == 'c') {
				return array(
					'c' => 'Поток 11-х. 1-годы'
				);
			}
		} else {
			return array();
		}
	}
	
	/**
	 * Возвращает нужные классы по условию
	 * Если $key и $value пустые, то будут выданы все классы
	 */
	private function get_needed_classes($key = '', $value = '') {
		$classes = array();
		for ($i = 0; $i < count($this->classes_data); $i++) {
			if ((empty($key) && empty($value)) || $this->classes_data[$i][$key] == $value) {
				if ($this->with_code) {
					$classes[$this->classes_data[$i]['class_name']] = $this->classes_data[$i]['class_name'];
				} else {
					$classes[] = $this->classes_data[$i]['class_name'];
				}
			}
		}
		return $classes;
	}
	
	function get_classes() {
		if ($this->code == 'all') {
			return array_merge($this->get_codes_for_display(), $this->get_needed_classes());
		} else if (preg_match("/^(a|b|c)$/", $this->code) === 1) {
			return array_merge($this->get_codes_for_display(), $this->get_needed_classes('stream', $this->code));
		} else if (preg_match("/^(pm|cb)$/", $this->code) === 1) {
			return $this->get_needed_classes('specialization',  $this->code);
		} else {
			return $this->get_needed_classes('class_name', $this->code);
		}
	}
	
	/**
	 * Возвращает данные о классе
	 */
	private function get_class_data($class_name, $data) {
		for ($i = 0; $i < count($this->classes_data); $i++) {
			if ($class_name == $this->classes_data[$i]['class_name']) {
				return $this->classes_data[$i][$data];
			}
		}
		throw new Exception("'$class_name' is invalid class name");
	}
	
	/**
	 * Возвращает код специализации
	 * @param string $class_name Название класса
	 */
	function get_specialization($class_name) {
		return $this->get_class_data($class_name, 'specialization');
	}
	
	/**
	 * Возвращает код потока
	 * @param string $class_name Название класса
	 */
	function get_stream($class_name) {
		return $this->get_class_data($class_name, 'stream');
	}
}

?>
